package com.gitee.hellowllh.dlearn.algorithm.leetcode.skill.pointer;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.junit.Assert.assertEquals;

/**
 *   <a href='https://baike.baidu.com/item/回文串/1274921' >
 *       回文串 : 一个正读和反读都一样的字符串，比如“level”或者“noon”等等就是回文串。 </a>
 * <br/>
 * 125. 验证回文串
 * 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
 *
 * 说明：本题中，我们将空字符串定义为有效的回文串。
 *
 *
 *
 * 示例 1:
 *
 * 输入: "A man, a plan, a canal: Panama"
 * 输出: true
 * 解释："amanaplanacanalpanama" 是回文串
 * 示例 2:
 *
 * 输入: "race a car"
 * 输出: false
 * 解释："raceacar" 不是回文串
 *
 *
 * 提示：
 *
 * 1 <= s.length <= 2 * 105
 * 字符串 s 由 ASCII 字符组成
 * 通过次数257,273提交次数543,103
 * 请问您在哪类招聘中遇到此题？
 * 贡献者
 * LeetCode
 * 回文链表
 * 简单
 * 验证回文字符串 Ⅱ
 */
@RunWith(Parameterized.class)
public class ValidPalindrome {
    String s;
    boolean target;

    public ValidPalindrome(String s, boolean target) {
        this.s = s;
        this.target = target;
    }

    @Parameterized.Parameters
    public static Collection prepareData() {
        // 示例:
        Object[][] object = {
                { "A man, a plan, a canal: Panama" , true  } ,
                { "race a car" , false  } ,
        };
        return Arrays.asList(object);// 数组转化成集合形式。
    }

    @Test
    public void testOk() {
        // 注意是调用的成员变量。
        boolean i = this.isPalindrome(this.s);
        assertEquals(this.target,i);
    }

    /**
     *
     * @param s
     * @return
     */
    public boolean isPalindrome(String s) {
        // 不区分大小写。
        s = s.toUpperCase();
        // 双向指针:
        int head = 0 , tail = s.length() -1 ;

        // 当tail 小于了，就停止了。
        while( head <= tail ){
            char headChar = s.charAt(head);
            char tailChar = s.charAt(tail);

            /*
            忽略跳过的。
             */
            if( !Character.isLetterOrDigit(headChar) ){
                head ++ ;
            }else if ( !Character.isLetterOrDigit(tailChar) ){
                tail --;
            }
            /*
            判断..
             */
            else if(headChar == tailChar){
                tail --;
                head ++ ;
            }else if(headChar != tailChar){
                return false;
            }
        }
        return true;
    }


    /**
     *
     */

    /**
     * 总结；
     * java.lang.Character.isLetterOrDigit(char ch) 确定指定的字符是否为字母或数字。字符被认为是字母或数字，如果字符不是Character.isLetter(char ch)也不Character.isDigit(char ch) ，则返回true。
     *
     */
}
